// Package api 提供HTTP路由和请求处理功能
// 该包使用Fiber框架来处理HTTP请求和响应
package api

import (
	"aigen-todo/internal/config"
	"aigen-todo/internal/middleware"
	"aigen-todo/internal/repository"
	"aigen-todo/internal/service"

	"github.com/gofiber/fiber/v2"
	"gorm.io/gorm"
)

// SetupRouter 配置应用程序的所有HTTP路由
// 参数:
//
//	cfg - 应用程序配置
//	db - 数据库连接实例
//
// 返回值:
//
//	*fiber.App - Fiber应用实例
func SetupRouter(cfg *config.Config, db *gorm.DB) *fiber.App {
	// 初始化Fiber应用
	// fiber.New()创建一个带有Logger和Recovery中间件的应用
	app := fiber.New(fiber.Config{
		ErrorHandler: func(c *fiber.Ctx, err error) error {
			return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
				"code":    fiber.StatusInternalServerError,
				"success": false,
				"message": "服务器错误",
			})
		},
	})

	// 创建公开路由组
	// 所有API路由都以/api/v1为前缀
	public := app.Group("/api/v1")

	// 如果数据库连接可用，则设置完整路由
	// 当数据库连接成功时，配置所有API路由
	if db != nil {
		// 初始化数据访问层仓库
		// 每个实体都有对应的仓库用于数据库操作
		userRepo := repository.NewUserRepository(db)
		taskGroupRepo := repository.NewTaskGroupRepository(db)
		taskRepo := repository.NewTaskRepository(db)
		taskLogRepo := repository.NewTaskLogRepository(db)

		// 初始化业务逻辑层服务
		// 服务层封装业务逻辑并调用仓库层进行数据操作
		userService := service.NewUserService(userRepo)
		taskGroupService := service.NewTaskGroupService(taskGroupRepo, userRepo)
		taskService := service.NewTaskService(taskRepo, taskGroupRepo, userRepo)
		taskLogService := service.NewTaskLogService(taskLogRepo, taskRepo)

		// 注册认证相关路由处理器
		// 包括用户注册和登录功能
		public.Post("/register", RegisterHandler(userService))
		public.Post("/login", LoginHandler(userService, cfg))

		// 创建受保护的路由组
		// 受保护的路由需要JWT认证才能访问
		protected := app.Group("/api/v1")
		protected.Use(middleware.JWTAuth(cfg))

		// 任务分组相关路由
		// 提供任务分组的增删改查功能
		{
			protected.Post("/task-groups", CreateTaskGroupHandler(taskGroupService))
			protected.Get("/task-groups", GetTaskGroupsHandler(taskGroupService))
			protected.Put("/task-groups/:id", UpdateTaskGroupHandler(taskGroupService))
			protected.Delete("/task-groups/:id", DeleteTaskGroupHandler(taskGroupService))
		}

		// 任务相关路由
		// 提供任务的增删改查及特殊功能
		{
			protected.Post("/tasks", CreateTaskHandler(taskService))
			protected.Get("/tasks", GetTasksHandler(taskService))
			protected.Get("/tasks/my-day", GetMyDayTasksHandler(taskService))
			protected.Get("/tasks/:id", GetTaskHandler(taskService))
			protected.Put("/tasks/:id", UpdateTaskHandler(taskService))
			protected.Delete("/tasks/:id", DeleteTaskHandler(taskService))
			protected.Put("/tasks/:id/group", ChangeTaskGroupHandler(taskService))
		}

		// 任务日志相关路由
		// 提供任务日志的增删改查功能
		{
			protected.Post("/tasks/:id/logs", CreateTaskLogHandler(taskLogService))
			protected.Get("/tasks/:id/logs", GetTaskLogsHandler(taskLogService))
		}
	} else {
		// 数据库不可用时，设置有限功能的路由
		// 当数据库连接失败时，返回错误信息而不是完全不可用
		public.Post("/register", func(c *fiber.Ctx) error {
			return ServiceUnavailable(c) // 使用默认错误消息
		})

		public.Post("/login", func(c *fiber.Ctx) error {
			return ServiceUnavailable(c) // 使用默认错误消息
		})
	}

	return app
}
